﻿import com.greensock.*;

stop();


/* 
 * Variáveis
 */

// Para o usuário não precisar clicar exatamente em cima 
// do primeiro ponto para fechar o polígono
var MARGEM_ERRO = 5;
var NEWLINE 	= SetNewline();

var color_array = ["0xBB0000", "0x0000BB", "0xFFFF00"];
var actualColor;
var poligono1_array; 
var poligono2_array;
var poligonos_array;
var pincel;
var botoes_array = [botao1_btn, botao2_btn, botao3_btn, botao4_btn];

var clipboard_str;



/*
 * Funções
 */

// Inicialização do programa
function Iniciar()
{
	colar_mc.visible 		= false;
	colar_mc.buttonMode 	= true;	
	colar_mc.mouseChildren 	= false;
	colar_mc.addEventListener(MouseEvent.CLICK, GetResultado);
	
	clipboard_txt.visible 	= false;
	resultado_txt.visible	= false;
	
	actualColor = 0;
	poligono1_array = new Array();
	poligono2_array = new Array();
	poligonos_array = new Array();

	canvas_mc.visible = true;
	canvas_mc.addEventListener(MouseEvent.CLICK, DesenharPonto);
	
	botao1_btn.addEventListener(MouseEvent.CLICK, Diferenca1	);
	botao2_btn.addEventListener(MouseEvent.CLICK, Diferenca2	);
	botao3_btn.addEventListener(MouseEvent.CLICK, Uniao		);
	botao4_btn.addEventListener(MouseEvent.CLICK, Intersecao	);
	
	DesabilitarBotoes();
	
	AtualizarPincel(color_array[actualColor]);
	
	with (reiniciar_mc)
	{
		visible 	= false;
		buttonMode 	= true;
		addEventListener(MouseEvent.CLICK, Limpar);
	}
}


// Preparação do programa para ser reiniciado
function Limpar(evt:MouseEvent)
{	
	while (canvas_mc.numChildren > 1) canvas_mc.removeChildAt(1);
	actualColor = 0;
	canvas_mc.mouseEnabled = true;
	
	resultado_txt.text = "";
	
	titulo_txt.text = "Desenhe dois polígonos na região abaixo e escolha a operação desejada:";
	
	Iniciar();
}


// Modificação dos atributos do pincel 
function AtualizarPincel(bg=null, border=null)
{
	pincel = new Shape();
	if (bg != null) pincel.graphics.beginFill(bg);
	else pincel.graphics.beginFill("0xFFFFFF", 0);
	
	if (border != null)
	{
		if (actualColor < 2) 	pincel.graphics.lineStyle(3, border);
		else 					pincel.graphics.lineStyle(1, border);
	}
}


// Função que desenha um ponto na tela
// e verifica o "fechamento" de um polígono
function DesenharPonto(evt:MouseEvent)
{
	var posX = stage.mouseX-canvas_mc.x-2;
	var posY = stage.mouseY-canvas_mc.y-2;
	var poligono_array;
	var fechou = false;
	var len;
	
	if (actualColor == 0) 		poligono_array = poligono1_array;
	else if (actualColor == 1)	poligono_array = poligono2_array;
	
	len = poligono_array.length;

	if (poligono_array.length > 2 && Math.abs(posX-poligono_array[0][0]) <= MARGEM_ERRO && Math.abs(posY-poligono_array[0][1]) <= MARGEM_ERRO)
	{
		fechou = true;
		posX = poligono_array[0][0];
		posY = poligono_array[0][1];
	}
	else poligono_array.push([posX, posY]);
	
	len++;
	
	if (fechou) 
	{
		DesenharPoligono(poligono_array);
	}
	else
	{
		if (len > 1) DesenharAresta(poligono_array[len-2], poligono_array[len-1]);
		else		 pincel.graphics.drawEllipse(posX-3, posY-3, 6, 6);		
		
		canvas_mc.addChild(pincel);
	}
}


function DesenharAresta(p1:Array, p2:Array)
{
	AtualizarPincel(null, color_array[actualColor]);
	pincel.graphics.moveTo(p1[0], p1[1]);
	pincel.graphics.lineTo(p2[0], p2[1]);
}


// Função chamada quando um polígono é fechado
// ou quando se quer mostrar o resultado da operação escolhida.
function DesenharPoligono(pol:Array, botoes:Boolean=true)
{
	// Limpando o canvas
	while (canvas_mc.numChildren > 1) canvas_mc.removeChildAt(1);
	
	AtualizarPincel(null, color_array[actualColor]);
	
	pincel.graphics.moveTo(pol[0][0], pol[0][1]);
	
	for (var i = 1; i < pol.length; i++)
	{
		pincel.graphics.lineTo(pol[i][0], pol[i][1]);
	}
	
	poligonos_array.push(pincel);
	
	for (i = 0; i < poligonos_array.length; i++) canvas_mc.addChild(poligonos_array[i]);
	
	if (actualColor < 2) actualColor++;
	
	AtualizarPincel(color_array[actualColor]);
	
	// Desenhou dois polígonos
	if (actualColor == 2 && botoes) HabilitarBotoes();
}


// As operações só são habilitadas quando dois
// polígonos são desenhados
function HabilitarBotoes()
{
	canvas_mc.mouseEnabled = false;

	for (var i=0; i<botoes_array.length; i++)
	{
		botoes_array[i].mouseEnabled = true;
	}
}


// Quando uma operação é escolhida, desabilitam-se os
// botões até que o usuário clique em REINICIAR
function DesabilitarBotoes(btn=null)
{
	for (var i=0; i<botoes_array.length; i++)
	{
		if (botoes_array[i] != btn) botoes_array[i].mouseEnabled = false;
	}
}


// Operação Polígono1 - Polígono2
function Diferenca1(evt:MouseEvent)
{
	DesabilitarBotoes(botao1_btn);
	
	clipboard_str = "difference";
	
	ConcatenaPoligonos();
}


// Operação Polígono2 - Polígono1
function Diferenca2(evt:MouseEvent)
{
	DesabilitarBotoes(botao2_btn);
	
	clipboard_str = "difference";
	
	ConcatenaPoligonos(-1);
}


// Operação Polígono1 U Polígono2
function Uniao(evt:MouseEvent)
{
	DesabilitarBotoes(botao3_btn);
	
	clipboard_str = "union";
	
	ConcatenaPoligonos();
}


// Operação Polígono1 inter Polígono2
function Intersecao(evt:MouseEvent)
{
	DesabilitarBotoes(botao4_btn);
	
	clipboard_str = "intersection";
	
	ConcatenaPoligonos();
}


// Concatena os polígonos na string do clipboard
// seguindo o formato aceito pelo programa em C
function ConcatenaPoligonos(x=null)
{
	var i;
	
	if (x != -1)
	{
		for (i = 0; i<poligono1_array.length; i++)
		{
			clipboard_str += NEWLINE + poligono1_array[i][0] + " " + poligono1_array[i][1];
		}
		
		clipboard_str += NEWLINE+"x";
		
		for (i = 0; i<poligono2_array.length; i++)
		{
			clipboard_str += NEWLINE + poligono2_array[i][0] + " " + poligono2_array[i][1];
		}
	}
	else
	{
		for (i = 0; i<poligono2_array.length; i++)
		{
			clipboard_str += NEWLINE + poligono2_array[i][0] + " " + poligono2_array[i][1];
		}
		
		clipboard_str += NEWLINE+"x";
		
		for (i = 0; i<poligono1_array.length; i++)
		{
			clipboard_str += NEWLINE + poligono1_array[i][0] + " " + poligono1_array[i][1];
		}		
	}
	
	clipboard_str += NEWLINE;
	
	System.setClipboard(clipboard_str);
	
	titulo_txt.text = "Os dados estão na área de transferência. Cole em um arquivo de texto.";
	titulo_txt.appendText("\nDepois, copie o resultado do executável e clique em 'COLAR RESULTADO'.");
	
	TweenLite.to(canvas_mc, 1, {alpha:0.1});
	
	clipboard_txt.visible 	= true;
	clipboard_txt.text 		= clipboard_str;
	colar_mc.visible 		= true;
}


// Descobre o caractere ENTER de acordo com o SO
function SetNewline():String
{
	var os_str = Capabilities.os;
	
	if (os_str.search("Windows") >= 0)
	{
		trace("Windows");
		return "\r\n";
	}
	else if (os_str.search("Mac") >= 0)
	{
		trace("Mac");
		return "\r";
	}
	else 
	{
		trace("Linux");
		return "\n";
	}
}


// Pega o resultado digitado pelo usuário
function GetResultado(evt:MouseEvent)
{
	DesabilitarBotoes();
	
	clipboard_txt.visible 	= false;
	clipboard_str 			= "";
	resultado_txt.visible	= true;
	
	colar_mc.removeEventListener(MouseEvent.CLICK, GetResultado);
	colar_mc.addEventListener	(MouseEvent.CLICK, MostrarResultado);
	colar_mc.label_txt.text	= "MOSTRAR RESULTADO";
}


// Trata a string do resultado e desenha os polígonos
function MostrarResultado(evt:MouseEvent)
{
	var i, j = 0;
	var pol = new Array();
	var str, num1, num2;
	
	colar_mc.visible 		= false;
	reiniciar_mc.visible 	= true;
	TweenLite.to(canvas_mc, 1, {alpha:1});
	resultado_txt.visible 	= false;
	
	for (i=0; i<resultado_txt.numLines; i++)
	{
		str = resultado_txt.getLineText(i);
		
		if (str.length > 2) // representa um ponto
		{
			trace("ponto = "+str);
			
			pol.push([Number(str.split(" ")[0]), Number(str.split(" ")[1])]);
			
			trace (pol);
		}
		else if (str.search("x") > -1) // acabou um poligono
		{
			trace("acabou um poligono");
			
			DesenharPoligono(pol, false);
			
			pol = new Array();
		}
		else continue; // nao ha ponto na linha
	}
	
	if (pol.length > 0) // sobrou um poligono depois do ultimo 'x'
		DesenharPoligono(pol, false);
	
	colar_mc.removeEventListener(MouseEvent.CLICK, MostrarResultado);
	colar_mc.label_txt.text	= "COLAR RESULTADO";
}


Iniciar();